/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package aso.upna.playlist;

import aso.upna.cancion.*;
import aso.upna.exceptions.PlaylistEmpty;
import java.io.Serializable;
import java.util.Vector;

/**
 *
 * @author triki
 */

public class PlayList implements Serializable {

    private String name;
    private int actual;
    private Vector lista;
    private boolean cycle;
    
    public PlayList(String name)
    {
        actual = 0;
        this.name = new String(name);
        lista = new Vector();
        cycle = false;
    }

    public PlayList(String name,boolean cycle)
    {
        actual = 0;
        this.name = new String(name);
        lista = new Vector();
        this.cycle = cycle;
    }

    public String getName()
    {
        return name;
    }

    public void nextCancion()
    {
        System.out.println(">>>>>>>>>>>>>>>>>>>>> Actual: "+actual);
        if(actual+1 < lista.size())
            actual++;
        else
            actual = 0;
    }

    public void previousCancion()
    {
        if(actual-1 >= 0)
            actual--;
        else
            actual = lista.size();
    }

    public void setActual(int pos)
    {
        if(pos >=0 || pos < lista.size())
            actual = pos;
    }

    public void addCancion(String nombre,String path,boolean local)
    {
        if(local)
            lista.add(new CancionLocal(nombre,path));
        else
            lista.add(new CancionRemota(nombre,path));
    }

    public void addCancion(AbstractCancion can)
    {
        lista.add(can);
    }

    public boolean moveCancionTo(int p_actual,int pos_f)
    {
        int next = p_actual+pos_f;

        if(next >= 0 && next < getNumCanciones())
        {
            permutarCanciones(p_actual,next);
            return true;
        }
        else
            return false;
    }

    private void permutarCanciones(int p1,int p2)
    {
        if(p1 > p2)
        {
            Object obj1 = lista.get(p1);
            Object obj2 = lista.get(p2);
            lista.remove(p1);
            lista.remove(p2);
            lista.add(p2, obj1);
            lista.add(p1, obj2);
        }
        else
        {
            Object obj1 = lista.get(p1);
            Object obj2 = lista.get(p2);
            lista.remove(p2);
            lista.add(p2,obj1);
            lista.remove(p1);
            lista.add(p1,obj2);
        }
    }

    public int getNumCanciones()
    {
        return lista.size();
    }

    public int getCancionesRestantes()
    {
        return lista.size() - actual;
    }

    public AbstractCancion getActualCancion() throws PlaylistEmpty
    {
        if(getNumCanciones() > 0)
            return (AbstractCancion) lista.get(actual);
        else
            throw new PlaylistEmpty();
    }

    public GenericIterator getIterator()
    {
        return new GenericIterator(lista);
    }
    
}
